﻿/*
做幻方 
Time Limit:1000MS  Memory Limit:1024K

  
Description:
Apple最近迷上了做幻方，Apple还是个中高手，只要你说个奇数N就能把N*N的幻方做出来。
其实你可以比他做得更好的。Apple总是画得很乱，而你可以利用程序排得很整齐^_^ 幻方的要求：
每一行，每一列，还有两条斜线上数字的和都相等 

Input:
每行一个数N(0< N < 30),输入0结束 
Output:
输入一个奇数，输出一个幻方，每个数占3格，顺序参照样板输出,输出完以后加一个回车。 
Sample Input:
5
1
0

Sample Output:
 11 18 25  2  9
 10 12 19 21  3
  4  6 13 20 22
 23  5  7 14 16
 17 24  1  8 15

1
Hint:
如果不会做幻方的请从1开始数到最后，相信你会发现其中的规律。当然输出也要按照这样的格式
*/

#include <stdio.h>
#include <stdlib.h>
const unsigned MATRIX_SIZE=30;

int main()
{
	unsigned n;
	bool first_time=true;
	while (EOF!=scanf("%u", &n), n)
	{
		unsigned maxtrix[MATRIX_SIZE+1][MATRIX_SIZE+1]={{0U}};
		unsigned i=n, j=(n+1)/2, k=1;
		maxtrix[i][j]=k;

		for (unsigned sqr=n*n; k<sqr;)
		{
			unsigned _i=i, _j=j;

			++i;
			++j;
			++k;
			if(i>n)
				i=1;
			if(j>n)
				j=1;
			if(maxtrix[i][j])
			{
				i=_i;
				j=_j;
				--i;
			}
			maxtrix[i][j]=k;
		}
		if(!first_time)
		{
			printf("\n");
		}
		for (i=1; i<=n; ++i)
		{
			for (j=1; j<=n; ++j)
			{			
				printf("%3u",maxtrix[i][j]);
			}
			printf("\n");
		}
	
		
		first_time=false;
	}
	return EXIT_SUCCESS;
}
/*
#include<iostream>
#include<iomanip>
#include<vector>

using namespace std;

int main()
{
	int a, i, j;
	vector<int> array;
	while (cin >> a && a != 0)
	{
		array.push_back(a);
	}

	for (int k = 0; k < array.size(); k++)
	{
		if (k != 0)
			cout << endl;
		int mat[30][30] =
		{
			{0}, {0}, {0}
		};

		for (i = 0; i < array[k]; i++)
			for (j = 0; j < array[k]; j++)
				mat[(array[k] + array[k] - 1 + j - i * 2) % array[k]][(array[k] + (array[k] - 1) / 2 + j - i) % array[k]] = i * array[k] +
					j +
					1;



		for (i = 0; i < array[k]; i++)
		{
			for (j = 0; j < array[k]; j++)
			{
				cout << setw(3) << mat[i][j];
			}
			cout << endl;
		}
	}
	return 0;
}
*/